@file:Suppress("unused")

package cn.qfys521.mc_websocket.client

import kotlinx.serialization.Serializable

/**
 * JSON-RPC 2.0 请求。
 * @param Params params 的序列化类型（允许为 null 表示省略 params）。
 * @property jsonrpc 固定为 "2.0"。
 * @property method 方法名。
 * @property params 单元素数组中携带的参数对象（外层由调用方封装为数组）。
 * @property id 请求 ID；通知时为 null。
 */
@Serializable
internal data class JsonRpcRequest<Params>(
    val jsonrpc: String = "2.0",
    val method: String,
    val params: Params? = null,
    val id: Long? = null,
)

/**
 * JSON-RPC 2.0 响应。
 * @param Result result 的反序列化类型。
 * @param ErrData error.data 的反序列化类型。
 * @property jsonrpc 固定为 "2.0"。
 * @property id 对应请求 ID；通知时无此字段。
 * @property result 结果（成功时存在）。
 * @property error 错误对象（失败时存在）。
 */
@Serializable
internal data class JsonRpcResponse<Result, ErrData>(
    val jsonrpc: String = "2.0",
    val id: Long? = null,
    val result: Result? = null,
    val error: JsonRpcError<ErrData>? = null,
)

/**
 * JSON-RPC 错误对象。
 * @param Data error.data 的反序列化类型。
 * @property code 错误码。
 * @property message 错误信息。
 * @property data 附加数据（可选）。
 */
@Serializable
internal data class JsonRpcError<Data>(
    val code: Int,
    val message: String,
    val data: Data? = null,
)

/**
 * JSON-RPC 2.0 通知。
 * @param Params params 的序列化类型。
 * @property jsonrpc 固定为 "2.0"。
 * @property method 方法名。
 * @property params 负载（由调用方按协议数组解包）。
 */
@Serializable
internal data class JsonRpcNotification<Params>(
    val jsonrpc: String = "2.0",
    val method: String,
    val params: Params? = null,
)
